﻿#ifndef __CMutexRecursive_H__
#define __CMutexRecursive_H__
#include <lampe/types.h>
#include "CMutex.h"

#ifdef _IRR_WINDOWS_
#include <windows.h>
#endif

#ifdef _IRR_COMPILE_WITH_X11_DEVICE_
#include <pthread.h>
#endif

namespace lampe{
namespace thread{

/***
* @class CMutexRecursive
* Класс реализующий рекурсивный мьютекс. Контролирует повторный захват
* мьютекса одним и тем же потоком. Ошибки при повторном захвате НЕ вызывает
*/



class CMutexRecursive: public CMutex{
private:
	bool locked;
#ifdef _IRR_COMPILE_WITH_X11_DEVICE_
	pthread_mutex_t m_mutex;//! мьютекс
#endif

#ifdef _IRR_WINDOWS_
	HANDLE m_mutex;//! мьютекс
#endif
    lampe::u32 lockCount;
public:
	virtual void lock();
	virtual void unlock();
	virtual bool isLocked();

	CMutexRecursive();
	virtual ~CMutexRecursive();
};

extern IMutex*createRecursiveMutex();
}//namespace thread
}//namespace lampe

#endif
